home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 304_01 / roff58.c < prev    next >
Text File  |  1990-02-12  |  13KB  |  490 lines

  1. /********************************************************/
  2. /*         ROFF5, Version 2.00            */
  3. /*    (c) 1983,4,8,9 by Ernest E. Bergmann        */
  4. /*    730 Seneca Street, Bethlehem, Pa. 18015        */
  5. /*                            */
  6. /* Permission is hereby granted for all commercial and    */
  7. /* non-commercial reproduction and distribution of this    */
  8. /* material provided this notice is included.        */
  9. /********************************************************/
  10. #include <roff5.h>
  11. #if (VERSION!=2) || (subVERSION!=00)
  12. #error ***************This is version 2.00******************
  13. #endif
  14. /********************************************************/
  15. char *fgets3()
  16. {    int count,c,i,*pw;
  17.     char *cptr,*pc, *pc2;
  18.     ENTRY *pe;
  19.     char wbuf[LSZ],*fnd;
  20.     count = MAXLINE;
  21.     cptr = &LINE[0];
  22.     if ( (c=ngetc(ifp))==EOF) return (LIN=NULL);
  23.     do {    if(c==ICVAL[0])/*need macro substitution*/
  24.           {for(i=0;ICVAL[0]!=(wbuf[i]=ngetc(ifp));i++)
  25.             {if(wbuf[i]=='\n')
  26.                 {if(i) putback('\n');
  27.                 break;
  28.                 }
  29.             }
  30.           if(i)
  31.            {wbuf[i]='\0';
  32.             if (*wbuf=='\"')    /*comment rest of line*/
  33.             {*cptr='\n';
  34.              *(++cptr)='\0';
  35.              do c=ngetc(ifp);
  36.              while((c!='\n')&&(c!=EOF));
  37.              return( LIN=LINE );
  38.             }
  39.             else if(readonly(wbuf)) ; /* handled as predefined */
  40.             else if(NULL!=(pw=(int *)find2(wbuf,&RLINK)))/*register?*/
  41.             {itoC(*pw,wbuf,*(FORMAT *)(pw+1));
  42.             pbstr(wbuf);
  43.             }
  44.             else if(NULL!=(fnd=find2(wbuf,&SLINK))) pbstr(fnd);
  45.             else{
  46.             char buff[128];
  47.             unsigned siz;
  48.             ENTRY *where;
  49.  
  50.                 pc=wbuf;
  51.             pe=(ENTRY *)buff;
  52.             pe->link=SLINK.link;
  53.             pc2=(char *)&(pe->ident);
  54.             transfer(&pc,&pc2,'\0');
  55.             fprintf(stderr,"%cPlease define <%s>:",
  56.                         BELL,wbuf);
  57.             gets(wbuf);
  58.             pc=wbuf;
  59.             transfer(&pc,&pc2,'\0');
  60.             siz = pc2 - buff;
  61.             if (NULL==(where=(ENTRY *)malloc(siz)))
  62.                 exitm("fgets3(): cannot malloc\n");
  63.             SLINK.link = (ENTRY *)memcpy(where,buff,siz);
  64.             pbstr(wbuf);
  65.             }
  66.             continue;
  67.             }
  68.            else if(*wbuf!='\n') putback(ICVAL[0]);
  69.            c=ngetc(ifp);
  70.           }
  71.         if ((*cptr++ = c) == '\n') break;
  72.  
  73.      } while (count--&&(c=ngetc(ifp))!=EOF);
  74.        *cptr = '\0';
  75.     return (LIN=LINE);
  76. }
  77. /**************************************************************
  78. performs the formatting command returned by comtyp1 -sets global
  79.   variables ( indenting, underlining, etc. )
  80. "line" starts just after the ".".
  81. **************************************************************/
  82. void comand()
  83. {CMD c_type;    /* command type  */
  84. int arg_val;    /* argument value, if any */
  85. char arg_typ;    /* relative (+ or -) or absolute or conditional? */
  86. char wbuf[LSZ], *lptr;
  87. int i;
  88. c_type = comtyp1(LIN);
  89. switch (c_type)
  90.     {case UNKNOWN :
  91.         fprintf(stderr, "UNKNOWN COMMAND: <%s>\n", LINE);
  92.         return;
  93.     case DOTDOT : break;/* ignore remark */
  94.     case IG : ignore(); break;
  95.  
  96.     case FI :    /* filled lines  */
  97.         Brk();
  98.         FILL = YES;
  99.         break;
  100.     case NF :    /* non-filled lines */
  101.         Brk();
  102.         FILL = NO;
  103.         break;
  104.     case NA :    /* Not Adjust lines */
  105.         JUSTIFY = NO;
  106.         break;
  107.     case AD :    /* ADjust lines  */
  108.         adjust();
  109.         break;
  110.     case BR :    /* just cause a break */
  111.         Brk();
  112.         break;
  113.     case LS :    /* set line spacing value */
  114.         arg_val = get_val2(LIN, &arg_typ, &lptr );
  115.         setS(LSVAL, arg_val, arg_typ, LS_DEF, 1, HUGE );
  116.         break;
  117.     case TI :    /* set temporary left indent */
  118.         Brk();
  119.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  120.         set ( &TIVAL, arg_val, arg_typ, TI_DEF, 0, RMVAL );
  121.         break;
  122.     case M1:    /* set topmost margin */
  123.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  124.         setS( M1VAL, arg_val, arg_typ, M1_DEF,0,HUGE);
  125.         break;
  126.     case M2:    /* set second top margin */
  127.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  128.         setS( M2VAL, arg_val, arg_typ, M2_DEF,0,HUGE);
  129.         break;
  130.     case M3:    /* set first bottom margin */
  131.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  132.         setS( M3VAL, arg_val, arg_typ, M3_DEF,0,HUGE);
  133.         setTRAP();
  134.         break;
  135.     case M4:    /* set bottom-most margin */
  136.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  137.         setS(M4VAL, arg_val, arg_typ, M4_DEF,0,HUGE);
  138.         setTRAP();
  139.         break;
  140.     case CE :    /* center next arg_val lines */
  141.         Brk();
  142.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  143.         set ( &CEVAL, arg_val, arg_typ,CE_DEF,0, HUGE);
  144.         break;
  145.     case HE :    /* get header title for pages */
  146.         gettl3 ( LIN, EHEAD, &EH2, &EH3 );
  147.         gettl3 ( LIN, OHEAD, &OH2, &OH3 );
  148.         break;
  149.     case OH :    /*get odd header title*/
  150.         gettl3 ( LIN, OHEAD, &OH2, &OH3 );
  151.         break;
  152.     case EH :    /*get even header title*/
  153.         gettl3 ( LIN, EHEAD, &EH2, &EH3 );
  154.         break;
  155.     case FO :    /* get footer title for pages */
  156.         gettl3 ( LIN, EFOOT, &EF2, &EF3 );
  157.         gettl3 ( LIN, OFOOT, &OF2, &OF3 );
  158.         break;
  159.     case OF :    /* get odd page footer title*/
  160.         gettl3 ( LIN, OFOOT, &OF2, &OF3 );
  161.         break;
  162.     case EF :    /* get even page footer title*/
  163.         gettl3 ( LIN, EFOOT, &EF2, &EF3 );
  164.         break;
  165.     case SP :    /* space down arg_val blank lines */
  166.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  167.         set (&SPVAL, arg_val, arg_typ, 1, 0, HUGE);
  168.         *(--LIN)='\0';
  169.         space ( SPVAL );
  170.         break;
  171.     case GO :    /*advance printer to absolute location*/
  172.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  173.         if (arg_val>=VLINENO) break; /*already there*/
  174.         set (&SPVAL, arg_val, arg_typ, 1, 0, HUGE);
  175.         if ((SPVAL>PLINENO)&&!DIVERTING)
  176.         if (PLINENO) space ( SPVAL - VLINENO );
  177.         else space(SPVAL-M1VAL[0]-M2VAL[0]);
  178.         break;
  179.  
  180.     case ST :    /* stop(pause) at each page?*/
  181.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  182.         set(&PAGESTOP,arg_val,'0',YES,NO,YES);
  183.         break;
  184.     case BP :    /* set pageno arg_val - begin page */
  185.         Brk();
  186.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  187.         if(((VLINENO<=0)||(VLINENO>=FOOTLOC))&&
  188.             (arg_val==NO_VAL)) break;
  189.         if ( VLINENO > 0 )    space (HUGE);
  190.         set(&CURPAG,arg_val,arg_typ,CURPAG+1,0,9999);
  191.         NEWPAG = CURPAG;
  192.         break;
  193.     case NE :    /*"need"*/
  194.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  195.         if (arg_val==NO_VAL) arg_val=2;/*default*/
  196.         need(arg_val);
  197.         break;
  198.     case PL :    /* set page length */
  199.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  200.         setS(PLVAL, arg_val, arg_typ, PL_DEF,
  201.           M1VAL[0]+M2VAL[0]+M3VAL[0]+M4VAL[0]+1,HUGE);
  202.         setTRAP();
  203.         break;
  204.     case FF :    /*formfeed*/
  205.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  206.         set(&FFEED,arg_val,'0',FF_DEF,NO,YES);
  207.         break;
  208.     case SC :    /*space character*/
  209.         setchar(SCVAL,TRUE,SC_INI,BLANK,127);
  210.         break;
  211.     case AB :    /*abort*/
  212.         gwLIN(wbuf);    /*skip command*/
  213.         skip_blanks();
  214.         trunc_bl(LIN);
  215.         if(strlen(LIN)) fprintf(stderr,"\n%s\n",LIN);
  216.         else fprintf(stderr,"\n***USER ABORT***\n");
  217.         exit();
  218.     case TF :    /*translate flag */
  219.         setchar(TFVAL,TRUE,TF_DEF,BLANK+1,127);
  220.         break;
  221.     case CF :    /*character flag*/
  222.         setchar(CFVAL,TRUE,CF_DEF,BLANK+1,127);
  223.         break;
  224.     case IC :    /*insert character for macro replace*/
  225.         setchar(ICVAL,TRUE,IC_DEF,BLANK+1,127);
  226.         break;
  227.     case OU :    /*output code string*/
  228.         ocode(); break;
  229.     case FR :    /*define fractional or whole line spacing code*/
  230.         getfr(); break;
  231.     case WH : when();
  232.          setTRAP();
  233.          break;
  234.     case CH : changetrap();
  235.          setTRAP();
  236.          break;
  237.     case IT : itset();
  238.          break;
  239.     case EM : EMset();
  240.          break;
  241.     case DT : dtset();
  242.          break;
  243.     case TL :title3(LIN,CURPAG,PAGFMT); break;
  244.     case DS :    /*define string*/
  245.         insert(); break;
  246.     case DE :    /*define macro*/
  247.     case AM :    /*append macro*/
  248.         mappend(c_type);
  249.         break;
  250.     case NR :    /*number register */
  251.         dovar(); break;
  252.     case DI :    /*diversion to file*/
  253.     case DA :
  254.         dappend(c_type);
  255.         break;
  256.     case SO :    /*source from file*/
  257.         source(); break;
  258.     case OT :    /*Output Transaltion*/
  259.         getot(); break;
  260.     case TM :    /*msg to terminal*/
  261.         gwLIN(wbuf);    /*skip command*/
  262.         skip_blanks();
  263.         trunc_bl(LIN);
  264.         fprintf(stderr,"<%s>\n",LIN);
  265.         break;
  266.     case BJ :    /*break with right justification*/
  267.         if(FILL)/*not applicable otherwise*/
  268.         {spread(OUTBUF,
  269.             min(RMVAL-TIVAL,MAXLINE-1)-OUTW+1,
  270.             OUTWRDS);
  271.         Brk();
  272.         }
  273.         break;
  274.     case AF :    /*assign format to register variable*/
  275.         assignfmt();
  276.         break;
  277.     case CZ :    /*substitute ^Z character in decimal*/
  278.         arg_val = get_val2( LIN, &arg_typ, &lptr );
  279.         set(&CZSUB,arg_val,'0',(int)CZSUB_DEF,0,255);
  280.         break;
  281.     case RL :    /* Ruler Line similar to Wordstar for tabs*/
  282.         gwLIN(wbuf);    /*skip c